Micron Document
🎖️GitЯра🎖️

Node / meshtastic / Meshtastic-Android / files / core / data / src / commonTest / kotlin / org / meshtastic / core / data / repository / CommonPacketRepositoryTest.kt

Displaying Raw • Download

core/data/src/commonTest/kotlin/org/meshtastic/core/data/repository/CommonPacketRepositoryTest.kt 65a1f5ce4d0e4b8eafcd0bbfccafd41dc6ee888a (65a1f5ce) Text, 16.78 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.core.data.repository

Tff7b72import T7ee787kotlinx.coroutines.CompletableDeferred
Tff7b72import T7ee787kotlinx.coroutines.Dispatchers
Tff7b72import T7ee787kotlinx.coroutines.async
Tff7b72import T7ee787kotlinx.coroutines.awaitAll
Tff7b72import T7ee787kotlinx.coroutines.channels.Channel
Tff7b72import T7ee787kotlinx.coroutines.flow.first
Tff7b72import T7ee787kotlinx.coroutines.test.UnconfinedTestDispatcher
Tff7b72import T7ee787kotlinx.coroutines.test.runTest
Tff7b72import T7ee787okio.ByteString.Companion.toByteString
Tff7b72import T7ee787org.meshtastic.core.database.entity.MyNodeEntity
Tff7b72import T7ee787org.meshtastic.core.di.CoroutineDispatchers
Tff7b72import T7ee787org.meshtastic.core.model.DataPacket
Tff7b72import T7ee787org.meshtastic.core.model.MessageStatus
Tff7b72import T7ee787org.meshtastic.core.model.Node
Tff7b72import T7ee787org.meshtastic.core.testing.FakeDatabaseProvider
Tff7b72import T7ee787org.meshtastic.proto.Data
Tff7b72import T7ee787org.meshtastic.proto.MeshPacket
Tff7b72import T7ee787org.meshtastic.proto.PortNum
Tff7b72import T7ee787org.meshtastic.proto.User
Tff7b72import T7ee787kotlin.test.AfterTest
Tff7b72import T7ee787kotlin.test.BeforeTest
Tff7b72import T7ee787kotlin.test.Test
Tff7b72import T7ee787kotlin.test.assertEquals
Tff7b72import T7ee787kotlin.test.assertFalse
Tff7b72import T7ee787kotlin.test.assertNotEquals
Tff7b72import T7ee787kotlin.test.assertNotNull
Tff7b72import T7ee787kotlin.test.assertNull
Tff7b72import T7ee787kotlin.test.assertTrue

Tff7b72abstract Tff7b72class T56d364CommonPacketRepositoryTest Tb4b4b4{

Tff7b72protected Tff7b72lateinit Tff7b72var Te6edf3dbProviderTb4b4b4: Te6edf3FakeDatabaseProvider
Tff7b72private Tff7b72val Te6edf3testDispatcher Tff7b72= Te6edf3UnconfinedTestDispatcherTb4b4b4(Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3dispatchers Tff7b72= Te6edf3CoroutineDispatchersTb4b4b4(Te6edf3main Tff7b72= Te6edf3testDispatcherTb4b4b4, Te6edf3io Tff7b72= Te6edf3testDispatcherTb4b4b4, Te6edf3default Tff7b72= Te6edf3testDispatcherTb4b4b4)

Tff7b72protected Tff7b72lateinit Tff7b72var Te6edf3repositoryTb4b4b4: Te6edf3PacketRepositoryImpl

Tf0883e@BeforeTest
Tff7b72fun Td2a8ffsetupRepoTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3dbProvider Tff7b72= Te6edf3FakeDatabaseProviderTb4b4b4(Tb4b4b4)
Te6edf3repository Tff7b72= Te6edf3PacketRepositoryImplTb4b4b4(Te6edf3dbProviderTb4b4b4, Te6edf3dispatchersTb4b4b4)
Tb4b4b4}

Tf0883e@AfterTest
Tff7b72fun Td2a8fftearDownTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3dbProviderTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`savePacket persists and retrieves waypoints`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3myNodeNum Tff7b72= T79c0ff1
Tff7b72val Te6edf3contact Tff7b72= Ta5d6ff"Ta5d6ffcontactTa5d6ff"

T8b949e// Ensure my_node is present so getMessageCount finds the packet
Te6edf3dbProviderTb4b4b4.Te6edf3currentDbTb4b4b4.Te6edf3value
Tb4b4b4.Te6edf3nodeInfoDaoTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3setMyNodeInfoTb4b4b4(
Te6edf3MyNodeEntityTb4b4b4(
Te6edf3myNodeNum Tff7b72= Te6edf3myNodeNumTb4b4b4,
Te6edf3model Tff7b72= Ta5d6ff"Ta5d6ffmodelTa5d6ff"Tb4b4b4,
Te6edf3firmwareVersion Tff7b72= Ta5d6ff"Ta5d6ff1.0Ta5d6ff"Tb4b4b4,
Te6edf3couldUpdate Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3shouldUpdate Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3currentPacketId Tff7b72= T79c0ff0LTb4b4b4,
Te6edf3messageTimeoutMsec Tff7b72= T79c0ff0Tb4b4b4,
Te6edf3minAppVersion Tff7b72= T79c0ff0Tb4b4b4,
Te6edf3maxChannels Tff7b72= T79c0ff0Tb4b4b4,
Te6edf3hasWifi Tff7b72= Tff7b72falseTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)

Tff7b72val Te6edf3packet Tff7b72= Te6edf3DataPacketTb4b4b4(Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff0!ffffffffTa5d6ff"Tb4b4b4, Te6edf3bytes Tff7b72= Te6edf3okioTb4b4b4.Te6edf3ByteStringTb4b4b4.Te6edf3EMPTYTb4b4b4, Te6edf3dataType Tff7b72= T79c0ff1Tb4b4b4, Te6edf3id Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4)

Te6edf3repositoryTb4b4b4.Te6edf3savePacketTb4b4b4(Te6edf3myNodeNumTb4b4b4, Te6edf3contactTb4b4b4, Te6edf3packetTb4b4b4, T79c0ff1T79c0ff0T79c0ff0T79c0ff0LTb4b4b4)

T8b949e// Verify it was saved.
Tff7b72val Te6edf3count Tff7b72= Te6edf3repositoryTb4b4b4.Te6edf3getMessageCountTb4b4b4(Te6edf3contactTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3countTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`clearAllUnreadCounts works with real DB`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3repositoryTb4b4b4.Te6edf3clearAllUnreadCountsTb4b4b4(Tb4b4b4)
T8b949e// No exception thrown
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`same mesh packet id persists as distinct durable rows`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3first Tff7b72=
Te6edf3DataPacketTb4b4b4(
Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff!aaaa0001Ta5d6ff"Tb4b4b4,
Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6fffirstTa5d6ff"Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3dataType Tff7b72= T79c0ff1Tb4b4b4,
Te6edf3id Tff7b72= T79c0ff7T79c0ff7Tb4b4b4,
Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3second Tff7b72=
Te6edf3DataPacketTb4b4b4(
Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff!aaaa0001Ta5d6ff"Tb4b4b4,
Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6ffsecondTa5d6ff"Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3dataType Tff7b72= T79c0ff1Tb4b4b4,
Te6edf3id Tff7b72= T79c0ff7T79c0ff7Tb4b4b4,
Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4,
Tb4b4b4)

Tff7b72val Te6edf3firstId Tff7b72= Te6edf3repositoryTb4b4b4.Te6edf3savePacketTb4b4b4(T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ff0!aaaa0001Ta5d6ff"Tb4b4b4, Te6edf3firstTb4b4b4, T79c0ff1LTb4b4b4)
Tff7b72val Te6edf3secondId Tff7b72= Te6edf3repositoryTb4b4b4.Te6edf3savePacketTb4b4b4(T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ff0!aaaa0001Ta5d6ff"Tb4b4b4, Te6edf3secondTb4b4b4, T79c0ff2LTb4b4b4)
Tff7b72val Te6edf3meshPacket Tff7b72=
Te6edf3MeshPacketTb4b4b4(
Te6edf3from Tff7b72= T79c0ff1Tb4b4b4,
Te6edf3to Tff7b72= T79c0ff0Te6edf3xAAAA0001Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3id Tff7b72= T79c0ff7T79c0ff7Tb4b4b4,
Te6edf3decoded Tff7b72= Te6edf3DataTb4b4b4(Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4)Tb4b4b4,
Tb4b4b4)

Te6edf3assertNotEqualsTb4b4b4(Te6edf3firstIdTb4b4b4, Te6edf3secondIdTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6fffirstTa5d6ff"Tb4b4b4, Te6edf3repositoryTb4b4b4.Te6edf3getPacketByPersistedIdTb4b4b4(Te6edf3firstIdTb4b4b4)Tff7b72?.Te6edf3textTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6ffsecondTa5d6ff"Tb4b4b4, Te6edf3repositoryTb4b4b4.Te6edf3getPacketByPersistedIdTb4b4b4(Te6edf3secondIdTb4b4b4)Tff7b72?.Te6edf3textTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3setOfTb4b4b4(Te6edf3firstIdTb4b4b4, Te6edf3secondIdTb4b4b4)Tb4b4b4, Te6edf3repositoryTb4b4b4.Te6edf3getQueuedPacketsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3id Tb4b4b4}Tb4b4b4.Te6edf3toSetTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertNullTb4b4b4(Te6edf3repositoryTb4b4b4.Te6edf3getPacketByPacketIdIfUniqueTb4b4b4(T79c0ff7T79c0ff7Tb4b4b4)Tb4b4b4)
Te6edf3assertNullTb4b4b4(Te6edf3repositoryTb4b4b4.Te6edf3updateOutgoingMessageStatusTb4b4b4(Te6edf3meshPacketTb4b4b4, Te6edf3MessageStatusTb4b4b4.Te6edf3ENROUTETb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4, Te6edf3repositoryTb4b4b4.Te6edf3getPacketByPersistedIdTb4b4b4(Te6edf3firstIdTb4b4b4)Tff7b72?.Te6edf3statusTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4, Te6edf3repositoryTb4b4b4.Te6edf3getPacketByPersistedIdTb4b4b4(Te6edf3secondIdTb4b4b4)Tff7b72?.Te6edf3statusTb4b4b4)

Te6edf3repositoryTb4b4b4.Te6edf3updateMessageStatusTb4b4b4(Te6edf3firstIdTb4b4b4, Te6edf3MessageStatusTb4b4b4.Te6edf3ENROUTETb4b4b4)

Te6edf3assertEqualsTb4b4b4(Te6edf3firstIdTb4b4b4, Te6edf3repositoryTb4b4b4.Te6edf3updateOutgoingMessageStatusTb4b4b4(Te6edf3meshPacketTb4b4b4, Te6edf3MessageStatusTb4b4b4.Te6edf3ENROUTETb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3MessageStatusTb4b4b4.Te6edf3ENROUTETb4b4b4, Te6edf3repositoryTb4b4b4.Te6edf3getPacketByPersistedIdTb4b4b4(Te6edf3firstIdTb4b4b4)Tff7b72?.Te6edf3statusTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4, Te6edf3repositoryTb4b4b4.Te6edf3getPacketByPersistedIdTb4b4b4(Te6edf3secondIdTb4b4b4)Tff7b72?.Te6edf3statusTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`queued row can be claimed for send only once`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3queued Tff7b72=
Te6edf3DataPacketTb4b4b4(
Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff!aaaa0001Ta5d6ff"Tb4b4b4,
Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6ffclaimTa5d6ff"Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3dataType Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3id Tff7b72= T79c0ff8T79c0ff1Tb4b4b4,
Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3id Tff7b72= Te6edf3repositoryTb4b4b4.Te6edf3savePacketTb4b4b4(T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ff0!aaaa0001Ta5d6ff"Tb4b4b4, Te6edf3queuedTb4b4b4, T79c0ff1LTb4b4b4)

Tff7b72val Te6edf3firstClaim Tff7b72= Te6edf3assertNotNullTb4b4b4(Te6edf3repositoryTb4b4b4.Te6edf3claimQueuedPacketTb4b4b4(Te6edf3idTb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3secondClaim Tff7b72= Te6edf3assertNotNullTb4b4b4(Te6edf3repositoryTb4b4b4.Te6edf3claimQueuedPacketTb4b4b4(Te6edf3idTb4b4b4)Tb4b4b4)

Te6edf3assertEqualsTb4b4b4(Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4, Te6edf3firstClaimTb4b4b4.Te6edf3packetTb4b4b4.Te6edf3statusTb4b4b4, Ta5d6ff"Ta5d6fffirst caller owns the sendTa5d6ff"Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3MessageStatusTb4b4b4.Te6edf3ENROUTETb4b4b4, Te6edf3secondClaimTb4b4b4.Te6edf3packetTb4b4b4.Te6edf3statusTb4b4b4, Ta5d6ff"Ta5d6fflater caller must not send againTa5d6ff"Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3MessageStatusTb4b4b4.Te6edf3ENROUTETb4b4b4, Te6edf3repositoryTb4b4b4.Te6edf3getPacketByPersistedIdTb4b4b4(Te6edf3idTb4b4b4)Tff7b72?.Te6edf3statusTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`concurrent UUID and legacy claims produce one send owner`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3racingRepository Tff7b72=
Te6edf3PacketRepositoryImplTb4b4b4(
Te6edf3dbProviderTb4b4b4,
Te6edf3CoroutineDispatchersTb4b4b4(
Te6edf3main Tff7b72= Te6edf3testDispatcherTb4b4b4,
Te6edf3io Tff7b72= Te6edf3DispatchersTb4b4b4.Te6edf3DefaultTb4b4b4,
Te6edf3default Tff7b72= Te6edf3DispatchersTb4b4b4.Te6edf3DefaultTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3queued Tff7b72=
Te6edf3DataPacketTb4b4b4(
Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff!aaaa0001Ta5d6ff"Tb4b4b4,
Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6ffupgrade raceTa5d6ff"Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3dataType Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3id Tff7b72= T79c0ff8T79c0ff6Tb4b4b4,
Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3id Tff7b72= Te6edf3repositoryTb4b4b4.Te6edf3savePacketTb4b4b4(T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ff0!aaaa0001Ta5d6ff"Tb4b4b4, Te6edf3queuedTb4b4b4, T79c0ff1LTb4b4b4)
Tff7b72val Te6edf3start Tff7b72= Te6edf3CompletableDeferredTff7b72<Tffa657UnitTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3enteredProvider Tff7b72= Te6edf3ChannelTff7b72<Tffa657UnitTff7b72>Tb4b4b4(Te6edf3capacity Tff7b72= T79c0ff2Tb4b4b4)
Tff7b72val Te6edf3releaseProvider Tff7b72= Te6edf3CompletableDeferredTff7b72<Tffa657UnitTff7b72>Tb4b4b4(Tb4b4b4)
Te6edf3dbProviderTb4b4b4.Te6edf3beforeWithDb Tff7b72= Tb4b4b4{
Te6edf3enteredProviderTb4b4b4.Te6edf3sendTb4b4b4(Tffa657UnitTb4b4b4)
Te6edf3releaseProviderTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3stableClaim Tff7b72=
Te6edf3asyncTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3DefaultTb4b4b4) Tb4b4b4{
Te6edf3startTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3racingRepositoryTb4b4b4.Te6edf3claimQueuedPacketTb4b4b4(Te6edf3idTb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3legacyClaim Tff7b72=
Te6edf3asyncTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3DefaultTb4b4b4) Tb4b4b4{
Te6edf3startTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3racingRepositoryTb4b4b4.Te6edf3claimQueuedPacketByPacketIdIfUniqueTb4b4b4(Te6edf3queuedTb4b4b4.Te6edf3idTb4b4b4)
Tb4b4b4}

Te6edf3startTb4b4b4.Te6edf3completeTb4b4b4(Tffa657UnitTb4b4b4)
Te6edf3repeatTb4b4b4(T79c0ff2Tb4b4b4) Tb4b4b4{ Te6edf3enteredProviderTb4b4b4.Te6edf3receiveTb4b4b4(Tb4b4b4) Tb4b4b4}
Te6edf3releaseProviderTb4b4b4.Te6edf3completeTb4b4b4(Tffa657UnitTb4b4b4)
Tff7b72val Te6edf3claims Tff7b72= Te6edf3listOfTb4b4b4(Te6edf3stableClaimTb4b4b4, Te6edf3legacyClaimTb4b4b4)Tb4b4b4.Te6edf3awaitAllTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3assertNotNullTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}
Te6edf3dbProviderTb4b4b4.Te6edf3beforeWithDb Tff7b72= Tb4b4b4{Tb4b4b4}

Te6edf3assertEqualsTb4b4b4(Te6edf3setOfTb4b4b4(Te6edf3idTb4b4b4)Tb4b4b4, Te6edf3claimsTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3id Tb4b4b4}Tb4b4b4.Te6edf3toSetTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3claimsTb4b4b4.Te6edf3count Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3packetTb4b4b4.Te6edf3status Tff7b72=Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUED Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffone caller owns the sendTa5d6ff"Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3claimsTb4b4b4.Te6edf3count Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3packetTb4b4b4.Te6edf3status Tff7b72=Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3ENROUTE Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffone caller observes the claimTa5d6ff"Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3MessageStatusTb4b4b4.Te6edf3ENROUTETb4b4b4, Te6edf3racingRepositoryTb4b4b4.Te6edf3getPacketByPersistedIdTb4b4b4(Te6edf3idTb4b4b4)Tff7b72?.Te6edf3statusTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`legacy claim returns exact row identity and fails closed when ambiguous`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3unique Tff7b72=
Te6edf3DataPacketTb4b4b4(
Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff!aaaa0001Ta5d6ff"Tb4b4b4,
Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6ffuniqueTa5d6ff"Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3dataType Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3id Tff7b72= T79c0ff8T79c0ff2Tb4b4b4,
Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3uniqueId Tff7b72= Te6edf3repositoryTb4b4b4.Te6edf3savePacketTb4b4b4(T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ff0!aaaa0001Ta5d6ff"Tb4b4b4, Te6edf3uniqueTb4b4b4, T79c0ff1LTb4b4b4)

Tff7b72val Te6edf3claim Tff7b72= Te6edf3assertNotNullTb4b4b4(Te6edf3repositoryTb4b4b4.Te6edf3claimQueuedPacketByPacketIdIfUniqueTb4b4b4(Te6edf3uniqueTb4b4b4.Te6edf3idTb4b4b4)Tb4b4b4)

Te6edf3assertEqualsTb4b4b4(Te6edf3uniqueIdTb4b4b4, Te6edf3claimTb4b4b4.Te6edf3idTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4, Te6edf3claimTb4b4b4.Te6edf3packetTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3MessageStatusTb4b4b4.Te6edf3ENROUTETb4b4b4, Te6edf3repositoryTb4b4b4.Te6edf3getPacketByPersistedIdTb4b4b4(Te6edf3uniqueIdTb4b4b4)Tff7b72?.Te6edf3statusTb4b4b4)

Tff7b72val Te6edf3colliding Tff7b72= Te6edf3uniqueTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff3Tb4b4b4, Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6fffirstTa5d6ff"Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3firstId Tff7b72= Te6edf3repositoryTb4b4b4.Te6edf3savePacketTb4b4b4(T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ff0!aaaa0001Ta5d6ff"Tb4b4b4, Te6edf3collidingTb4b4b4, T79c0ff2LTb4b4b4)
Tff7b72val Te6edf3secondId Tff7b72=
Te6edf3repositoryTb4b4b4.Te6edf3savePacketTb4b4b4(
T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ff0!aaaa0001Ta5d6ff"Tb4b4b4,
Te6edf3collidingTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6ffsecondTa5d6ff"Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
T79c0ff3LTb4b4b4,
Tb4b4b4)

Te6edf3assertNullTb4b4b4(Te6edf3repositoryTb4b4b4.Te6edf3claimQueuedPacketByPacketIdIfUniqueTb4b4b4(Te6edf3collidingTb4b4b4.Te6edf3idTb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4, Te6edf3repositoryTb4b4b4.Te6edf3getPacketByPersistedIdTb4b4b4(Te6edf3firstIdTb4b4b4)Tff7b72?.Te6edf3statusTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4, Te6edf3repositoryTb4b4b4.Te6edf3getPacketByPersistedIdTb4b4b4(Te6edf3secondIdTb4b4b4)Tff7b72?.Te6edf3statusTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`failed-send rollback is exact and preserves a racing ACK`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3packet Tff7b72=
Te6edf3DataPacketTb4b4b4(
Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff!aaaa0001Ta5d6ff"Tb4b4b4,
Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6ffrollbackTa5d6ff"Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3dataType Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3id Tff7b72= T79c0ff8T79c0ff4Tb4b4b4,
Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3ackedId Tff7b72= Te6edf3repositoryTb4b4b4.Te6edf3savePacketTb4b4b4(T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ff0!aaaa0001Ta5d6ff"Tb4b4b4, Te6edf3packetTb4b4b4, T79c0ff1LTb4b4b4)
Tff7b72val Te6edf3failedId Tff7b72= Te6edf3repositoryTb4b4b4.Te6edf3savePacketTb4b4b4(T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ff0!aaaa0001Ta5d6ff"Tb4b4b4, Te6edf3packetTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff5Tb4b4b4)Tb4b4b4, T79c0ff2LTb4b4b4)
Te6edf3repositoryTb4b4b4.Te6edf3claimQueuedPacketTb4b4b4(Te6edf3ackedIdTb4b4b4)
Te6edf3repositoryTb4b4b4.Te6edf3claimQueuedPacketTb4b4b4(Te6edf3failedIdTb4b4b4)

Te6edf3repositoryTb4b4b4.Te6edf3updateMessageStatusTb4b4b4(Te6edf3ackedIdTb4b4b4, Te6edf3MessageStatusTb4b4b4.Te6edf3DELIVEREDTb4b4b4)

Te6edf3assertFalseTb4b4b4(Te6edf3repositoryTb4b4b4.Te6edf3rollbackEnroutePacketTb4b4b4(Te6edf3ackedIdTb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffACK advanced the row beyond ENROUTETa5d6ff"Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3repositoryTb4b4b4.Te6edf3rollbackEnroutePacketTb4b4b4(Te6edf3failedIdTb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffthe exact failed row is still ENROUTETa5d6ff"Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3MessageStatusTb4b4b4.Te6edf3DELIVEREDTb4b4b4, Te6edf3repositoryTb4b4b4.Te6edf3getPacketByPersistedIdTb4b4b4(Te6edf3ackedIdTb4b4b4)Tff7b72?.Te6edf3statusTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4, Te6edf3repositoryTb4b4b4.Te6edf3getPacketByPersistedIdTb4b4b4(Te6edf3failedIdTb4b4b4)Tff7b72?.Te6edf3statusTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`outgoing status update ignores inbound and different-port ID collisions`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3packetId Tff7b72= T79c0ff9T79c0ff1
Tff7b72val Te6edf3outgoing Tff7b72=
Te6edf3DataPacketTb4b4b4(
Te6edf3from Tff7b72= Ta5d6ff"Ta5d6ff^localTa5d6ff"Tb4b4b4,
Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff!22222222Ta5d6ff"Tb4b4b4,
Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6ffoutgoingTa5d6ff"Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3dataType Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3id Tff7b72= Te6edf3packetIdTb4b4b4,
Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3inbound Tff7b72=
Te6edf3DataPacketTb4b4b4(
Te6edf3from Tff7b72= Ta5d6ff"Ta5d6ff!33333333Ta5d6ff"Tb4b4b4,
Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff!11111111Ta5d6ff"Tb4b4b4,
Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6ffinboundTa5d6ff"Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3dataType Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3id Tff7b72= Te6edf3packetIdTb4b4b4,
Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3RECEIVEDTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3otherPort Tff7b72=
Te6edf3DataPacketTb4b4b4(
Te6edf3from Tff7b72= Ta5d6ff"Ta5d6ff^localTa5d6ff"Tb4b4b4,
Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff!22222222Ta5d6ff"Tb4b4b4,
Te6edf3bytes Tff7b72= Te6edf3byteArrayOfTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3dataType Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3ADMIN_APPTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3id Tff7b72= Te6edf3packetIdTb4b4b4,
Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3inboundId Tff7b72= Te6edf3repositoryTb4b4b4.Te6edf3savePacketTb4b4b4(T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ff0!33333333Ta5d6ff"Tb4b4b4, Te6edf3inboundTb4b4b4, T79c0ff1LTb4b4b4)
Tff7b72val Te6edf3otherPortId Tff7b72= Te6edf3repositoryTb4b4b4.Te6edf3savePacketTb4b4b4(T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ff0!22222222Ta5d6ff"Tb4b4b4, Te6edf3otherPortTb4b4b4, T79c0ff2LTb4b4b4)
Tff7b72val Te6edf3outgoingId Tff7b72= Te6edf3repositoryTb4b4b4.Te6edf3savePacketTb4b4b4(T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ff0!22222222Ta5d6ff"Tb4b4b4, Te6edf3outgoingTb4b4b4, T79c0ff3LTb4b4b4)

Tff7b72val Te6edf3updated Tff7b72=
Te6edf3repositoryTb4b4b4.Te6edf3updateOutgoingMessageStatusTb4b4b4(
Te6edf3MeshPacketTb4b4b4(
Te6edf3from Tff7b72= T79c0ff0Te6edf3x11111111Tb4b4b4,
Te6edf3to Tff7b72= T79c0ff0Te6edf3x22222222Tb4b4b4,
Te6edf3id Tff7b72= Te6edf3packetIdTb4b4b4,
Te6edf3decoded Tff7b72= Te6edf3DataTb4b4b4(Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3MessageStatusTb4b4b4.Te6edf3ENROUTETb4b4b4,
Tb4b4b4)

Te6edf3assertEqualsTb4b4b4(Te6edf3outgoingIdTb4b4b4, Te6edf3updatedTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3MessageStatusTb4b4b4.Te6edf3ENROUTETb4b4b4, Te6edf3repositoryTb4b4b4.Te6edf3getPacketByPersistedIdTb4b4b4(Te6edf3outgoingIdTb4b4b4)Tff7b72?.Te6edf3statusTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3MessageStatusTb4b4b4.Te6edf3RECEIVEDTb4b4b4, Te6edf3repositoryTb4b4b4.Te6edf3getPacketByPersistedIdTb4b4b4(Te6edf3inboundIdTb4b4b4)Tff7b72?.Te6edf3statusTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4, Te6edf3repositoryTb4b4b4.Te6edf3getPacketByPersistedIdTb4b4b4(Te6edf3otherPortIdTb4b4b4)Tff7b72?.Te6edf3statusTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`reply lookups stay in the current conversation when packet IDs collide`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3contactA Tff7b72= Ta5d6ff"Ta5d6ff0!aaaa0001Ta5d6ff"
Tff7b72val Te6edf3contactB Tff7b72= Ta5d6ff"Ta5d6ff0!bbbb0002Ta5d6ff"
Tff7b72val Te6edf3parentId Tff7b72= T79c0ff7T79c0ff7
Tff7b72val Te6edf3parentB Tff7b72=
Te6edf3DataPacketTb4b4b4(
Te6edf3from Tff7b72= Ta5d6ff"Ta5d6ff!bbbb0002Ta5d6ff"Tb4b4b4,
Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff^localTa5d6ff"Tb4b4b4,
Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6ffparent BTa5d6ff"Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3dataType Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3id Tff7b72= Te6edf3parentIdTb4b4b4,
Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3RECEIVEDTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3parentA Tff7b72= Te6edf3parentBTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3from Tff7b72= Ta5d6ff"Ta5d6ff!aaaa0001Ta5d6ff"Tb4b4b4, Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6ffparent ATa5d6ff"Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3replyB Tff7b72=
Te6edf3DataPacketTb4b4b4(
Te6edf3from Tff7b72= Ta5d6ff"Ta5d6ff!bbbb0002Ta5d6ff"Tb4b4b4,
Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff^localTa5d6ff"Tb4b4b4,
Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6ffreply BTa5d6ff"Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3dataType Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3id Tff7b72= T79c0ff7T79c0ff8Tb4b4b4,
Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3RECEIVEDTb4b4b4,
Te6edf3replyId Tff7b72= Te6edf3parentIdTb4b4b4,
Tb4b4b4)
T8b949e// Insert the wrong-conversation parent first so an old global LIMIT 1 lookup selects the wrong row.
Te6edf3repositoryTb4b4b4.Te6edf3savePacketTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3contactATb4b4b4, Te6edf3parentATb4b4b4, T79c0ff1LTb4b4b4)
Te6edf3repositoryTb4b4b4.Te6edf3savePacketTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3contactBTb4b4b4, Te6edf3parentBTb4b4b4, T79c0ff2LTb4b4b4)
Te6edf3repositoryTb4b4b4.Te6edf3savePacketTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3contactBTb4b4b4, Te6edf3replyBTb4b4b4, T79c0ff3LTb4b4b4)

Tff7b72val Te6edf3messages Tff7b72= Te6edf3repositoryTb4b4b4.Te6edf3getMessagesFromTb4b4b4(Te6edf3contactBTb4b4b4, Te6edf3getNode Tff7b72= Tff7b72::Te6edf3testNodeTb4b4b4)Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3reply Tff7b72= Te6edf3messagesTb4b4b4.Te6edf3single Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3packetId Tff7b72=Tff7b72= Te6edf3replyBTb4b4b4.Te6edf3id Tb4b4b4}
Tff7b72val Te6edf3pagedParent Tff7b72=
Te6edf3dbProviderTb4b4b4.Te6edf3currentDbTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3packetDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3getPacketsByPacketIdAndContactTb4b4b4(Te6edf3parentIdTb4b4b4, Te6edf3contactBTb4b4b4)Tb4b4b4.Te6edf3singleOrNullTb4b4b4(Tb4b4b4)

Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6ffparent BTa5d6ff"Tb4b4b4, Te6edf3replyTb4b4b4.Te6edf3originalMessageTff7b72?.Te6edf3textTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6ffparent BTa5d6ff"Tb4b4b4, Te6edf3pagedParentTff7b72?.Te6edf3packetTff7b72?.Te6edf3dataTff7b72?.Te6edf3textTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`reply parent fails closed for same-conversation ID collisions`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3contact Tff7b72= Ta5d6ff"Ta5d6ff0^allTa5d6ff"
Tff7b72val Te6edf3parentId Tff7b72= T79c0ff4T79c0ff4
Tff7b72val Te6edf3firstParent Tff7b72=
Te6edf3DataPacketTb4b4b4(
Te6edf3from Tff7b72= Ta5d6ff"Ta5d6ff!aaaa0001Ta5d6ff"Tb4b4b4,
Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff^allTa5d6ff"Tb4b4b4,
Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6fffirst parentTa5d6ff"Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3dataType Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3id Tff7b72= Te6edf3parentIdTb4b4b4,
Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3RECEIVEDTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3secondParent Tff7b72=
Te6edf3firstParentTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3from Tff7b72= Ta5d6ff"Ta5d6ff!bbbb0002Ta5d6ff"Tb4b4b4, Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6ffsecond parentTa5d6ff"Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3reply Tff7b72=
Te6edf3DataPacketTb4b4b4(
Te6edf3from Tff7b72= Ta5d6ff"Ta5d6ff!cccc0003Ta5d6ff"Tb4b4b4,
Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff^allTa5d6ff"Tb4b4b4,
Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6ffambiguous replyTa5d6ff"Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3dataType Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3id Tff7b72= T79c0ff4T79c0ff5Tb4b4b4,
Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3RECEIVEDTb4b4b4,
Te6edf3replyId Tff7b72= Te6edf3parentIdTb4b4b4,
Tb4b4b4)
Te6edf3repositoryTb4b4b4.Te6edf3savePacketTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3contactTb4b4b4, Te6edf3firstParentTb4b4b4, T79c0ff1LTb4b4b4)
Te6edf3repositoryTb4b4b4.Te6edf3savePacketTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3contactTb4b4b4, Te6edf3secondParentTb4b4b4, T79c0ff2LTb4b4b4)
Te6edf3repositoryTb4b4b4.Te6edf3savePacketTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3contactTb4b4b4, Te6edf3replyTb4b4b4, T79c0ff3LTb4b4b4)

Tff7b72val Te6edf3replyMessage Tff7b72=
Te6edf3repositoryTb4b4b4.Te6edf3getMessagesFromTb4b4b4(Te6edf3contactTb4b4b4, Te6edf3getNode Tff7b72= Tff7b72::Te6edf3testNodeTb4b4b4)Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3single Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3packetId Tff7b72=Tff7b72= Te6edf3replyTb4b4b4.Te6edf3id Tb4b4b4}
Tff7b72val Te6edf3pagedCandidates Tff7b72=
Te6edf3dbProviderTb4b4b4.Te6edf3currentDbTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3packetDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3getPacketsByPacketIdAndContactTb4b4b4(Te6edf3parentIdTb4b4b4, Te6edf3contactTb4b4b4)

Te6edf3assertNullTb4b4b4(Te6edf3replyMessageTb4b4b4.Te6edf3originalMessageTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff2Tb4b4b4, Te6edf3pagedCandidatesTb4b4b4.Te6edf3sizeTb4b4b4)
Te6edf3assertNullTb4b4b4(Te6edf3pagedCandidatesTb4b4b4.Te6edf3singleOrNullTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8fftestNodeTb4b4b4(Te6edf3idTb4b4b4: Tffa657String?Tb4b4b4)Tb4b4b4: Te6edf3Node Tff7b72= Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff0Tb4b4b4, Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Te6edf3idTb4b4b4.Te6edf3orEmptyTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.12s